// 立即执行函数，执行后立即释放
// IIFE immediately-invoked function expression

// (function(){
//   console.log(111);
// })()

// (function(){

// }())  w3c标准
// 返回值用return 返回交给一个变量

// 传参
// (function(a,b){
//   console.log(a+b);
// })(1,2)

// let test2 = function(){
//   console.log(1);
// }()

// 一定是表达式才能被执行符号执行 

// var test = function(){
//   console.log(1);
// }

// console.log(test);  // function test

// var test1 = function(){
//   console.log(2);
// }()

// console.log(test1); // 执行后被销毁 返回undefined

// (function test(){
//   console.log(123);
// })()

//函数声明变成表达式后，函数名会被自动忽略

// function test(){
//   console.log(1);
// }

// 函数声明 => 表达式   !+ && ||  （...）括号内的任意都会转化为表达式

// function test(){
//   console.log(1);
// }

// (6) 

// function test(){
//   var arr = []
//   for(var i = 0; i < 10; i++){
//     arr[i] = function(){
//       document.write(i + '')
//     }
//   }
//   return arr;
// }

// var myArr = test()

// for(var j = 0; j < 10; j++){
//   myArr[j]()  //10 ..10  原因是function 并不是立即执行函数，当执行时，i已经是10了
// }

// 使函数得到 0-9  for循环内立即执行或者用let 定义i
// function test(){
//   for(var i = 0; i < 10; i++){
//     (function(j){
//       console.log(j+1);
//     })(i);
//   }
// }

// test()

// var fn = (
//   function test(){
//     return 1;
//   },

//   function test2(){
//     return 2;
//   }
// )();

// var num = (1,2);
// let a = fn
// console.log(num);
// console.log(typeof(fn));

var a = 10;
if(function b(){}){ // (function b(){}) 函数声明 => 表达式  函数名忽略
  a += typeof(b)
}

console.log(a); // 10undefined